package com.zty.user.excel;

import com.zty.bean.PageResponse;
import com.zty.tool.excel.BaseEasyExcelExport;
import com.zty.user.entity.po.SysUser;
import com.zty.user.entity.req.SysUserReq;
import com.zty.user.service.SysUserService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.*;

/**
 * 商品数据导出
 * 这个实现类SysUserExcelExport具体实现了如何导出SysUser对象数据到Excel文件中。
 * 它定义了Excel的表头、如何计算数据总数、每个Sheet的记录数、每次写入的记录数以及如何构建具体的数据列表。
 * 在buildDataList方法中，它通过调用sysUserService.queryByPage方法实现了分页查询，这样可以避免一次性加载过多的数据导致内存溢出。
 * 然后它将每个用户的编号和姓名转换为Excel行数据添加到结果列表中。
 * <p>
 * 这个类可以被Spring容器管理，并且可以通过调用exportWithBigData方法来触发导出过程。
 * 这个过程会按照指定的条件和分页逻辑，将数据导出到客户端下载的Excel文件中
 *
 * @author: zty
 * @date: 2023/3/5
 */
// 使用@Component注解标记这个类为Spring框架的一个组件，这样Spring容器可以自动检测并管理它。
@Component
public class SysUserExcelExport extends BaseEasyExcelExport<SysUser> {

    // 使用@Resource注解注入SysUserService，这样我们可以使用它来查询用户数据。
    @Resource
    private SysUserService sysUserService;

    // 提供一个公共方法供外部调用，以触发Excel的导出过程。
    public void exportWithBigData(String fileName, Map<String, Object> conditions) {
        this.exportExcel(fileName, conditions);
    }

    // 实现获取Excel表头的方法。这个表头定义了两列：用户编号和用户姓名。
    @Override
    protected List<List<String>> getExcelHead() {
        List<List<String>> head = new ArrayList<>();
        head.add(Collections.singletonList("用户编号"));
        head.add(Collections.singletonList("用户姓名"));
        return head;
    }

    // 实现查询数据总数的方法。这里调用sysUserService的queryCount方法来获取总数。
    @Override
    protected Long dataTotalCount(Map<String, Object> conditions) {
        return sysUserService.queryCount(conditions);
    }

    // 指定每个Sheet页的记录数为5000。
    @Override
    protected Long eachSheetTotalCount() {
        return 5000L;
    }

    // 指定每次写入Sheet页的记录数为2000。
    @Override
    protected Long eachTimesWriteSheetTotalCount() {
        return 2000L;
    }

    // 实现构建每次查询数据列表的方法。这里使用分页查询来获取数据。
    @Override
    protected void buildDataList(List<List<String>> resultList, Map<String, Object> condition,
                                 Long pageNo, Long pageSize) {
        SysUserReq sysUserReq = new SysUserReq();
        // 可以根据condition设置查询条件，这里简化了条件的设置过程。
        sysUserReq.setPageNo(pageNo);
        sysUserReq.setPageSize(pageSize);
        // 调用服务层方法进行分页查询。
        PageResponse<SysUser> pageResponse = sysUserService.queryByPage(sysUserReq);
        // 获取查询结果。
        List<SysUser> sysUserList = pageResponse.getResult();
        // 如果查询结果不为空，则遍历用户列表，将用户信息添加到resultList中。
        if (CollectionUtils.isNotEmpty(sysUserList)) {
            sysUserList.forEach(sysUser -> {
                resultList.add(Arrays.asList(sysUser.getId().toString(), sysUser.getName()));
            });
        }
    }

}
